﻿// Item Editor
function cmsModuleEditor_ItemList_EditItem(editLink, moduleElement) {
    var item = null;
    var params = null;
    if (editLink != null) {
        item = $.evalJSON($.base64Decode($('#' + $(editLink).attr('rel')).val()));
    }
    $('#cmsItemListCreateItem').remove();
    var createItemElement = $('<div class="cmsModal" id="cmsItemListCreateItem"><span class="cmsLoading">' + cmsLoadingHTML + '</span></div>');
    $('body').append(createItemElement);
    createItemElement.modal();

    createItemElement.jForm({
        form: '/cms/modules/GetEditForm/' + moduleElement.data('config').ItemType,
        onLoaded: function() {
            createItemElement.find('form').append($('<div class="cmsClear">&nbsp;</div>'));
            createItemElement.find('form').after($('<div class="cmsClear">&nbsp;</div>'));
            createItemElement.find('.cmsLoading').remove();
        },
        onProceed: function(obj) {
            $.postJSON('/cms/info/MethodHandler/OpenQuarters.WebQuarters.Modules.ItemList,ItemListModule,Save', {
                EntityType: moduleElement.data('config').ItemType,
                Entity: $.base64Encode($.compactJSON(obj)),
                ModuleId: moduleElement.data('config').ModuleId,
                Url: window.location.href
            }, function(json) {
                cmsUpdateModule(moduleElement);
                $.modal.close();
                $('#cmsItemListCreateItem').remove();
            });
        },
        onCancel: function() {
            $.modal.close();
            $('#cmsItemListCreateItem').remove();
        },
        object: item
    });
};

// Delete item
function cmsModuleEditor_ItemList_DeleteItem(deleteLink, moduleElement) {
    var item = $.evalJSON($.base64Decode($('#' + $(deleteLink).attr('rel')).val()));
    $.postJSON('/cms/info/MethodHandler/OpenQuarters.WebQuarters.Modules.ItemList,ItemListModule,Delete', {
        EntityType: moduleElement.data('config').ItemType,
        Entity: $.base64Encode($.compactJSON(item)),
        ModuleId: moduleElement.data('config').ModuleId,
        Url: window.location.href
    }, function(json) {
        cmsUpdateModule(moduleElement);
    });
};

jQuery.fn.cmsModuleEditor_ItemList = function(opts) {

    return this.each(function() {
        if (!$(this).hasClass('cmsInherited')) {
            var moduleElement = $(this);

            // Setup item data if present
            moduleElement.find('.cmsItem').each(function() {
                var itemId = $(this).attr('rel');
                if (itemId && itemId.length > 0) {
                    var itemJSONField = $('#' + moduleElement.data('config').ItemType.replace(/\./g, '_') + '_' + itemId);
                    if (itemJSONField.length > 0) {
                        $(this).data('item', $.evalJSON($.base64Decode(itemJSONField.val())));
                    }
                }
            });

            // Item Edit links
            moduleElement.find('.cmsEditLink').each(function() {
                $(this).click(function() {
                    cmsModuleEditor_ItemList_EditItem(this, moduleElement);
                });
            });

            // Item Edit links
            moduleElement.find('.cmsDeleteLink').each(function() {
                $(this).click(function() {
                    if (confirm('Are you sure you want to delete this item?')) {
                        cmsModuleEditor_ItemList_DeleteItem(this, moduleElement);
                    }
                });
            });

            // Inline editable fields
            moduleElement.find('.editable').each(function() {
                var editableField = $(this).attr('rel');
                if (editableField.length > 0) {
                    if ($(this).attr('id').length == 0) {
                        $(this).attr('id', moduleElement.data('config').ItemType.replace(/\./g, '_') + '_' + $(this).parents('.cmsItem:first').attr('rel') + '_' + editableField);
                    }
                    $(this).cmsContentModuleEditor({
                        onSetup: function(editableContainer, nicEditor) {
                            $(editableContainer).parents('.cmsItem:first').data('item')[editableField] = nicEditor.getContent();
                        },
                        onSave: function(editableContainer, nicEditor) {
                            var itemContainer = $(editableContainer).parents('.cmsItem:first');
                            var itemData = itemContainer.data('item');
                            var itemDataField = itemData[editableField];

                            if (itemDataField != nicEditor.getContent()) {
                                itemData[editableField] = nicEditor.getContent();
                                itemContainer.data('item', itemData);

                                $.postJSON('/cms/info/MethodHandler/OpenQuarters.WebQuarters.Modules.ItemList,ItemListModule,Save', {
                                    EntityType: moduleElement.data('config').ItemType,
                                    Entity: $.base64Encode($.compactJSON(itemData)),
                                    ModuleId: moduleElement.data('config').ModuleId,
                                    Url: window.location.href
                                }, function(json) {
                                    var updateUrl = json.itemUrl;
                                    if (!moduleElement.data('additionalConfig').FullViewMode) {
                                        updateUrl = window.location.href;
                                    }
                                    cmsUpdateModule(moduleElement, { url: updateUrl });
                                });
                            }
                        }
                    });
                }
            });

            // Module options toolbar

            moduleOptions = $('<div class="cmsItemListOptions" id="cmsItemListOptions_' + $(this).attr('id') + '"><ul></ul><div class="cmsClear">&nbsp;</div></div>');
            var moduleOptionsUL = moduleOptions.find('ul:first');

            var optCreateItem = $('<li><a href="javascript:void(0);">Create Item</a></li>').appendTo(moduleOptionsUL);

            optCreateItem.find('a:first').click(function() {
                cmsUpdateModule(moduleElement, { createItem: 'true' });
            });

            var optFilterModule = $('<li><a href="javascript:void(0);">Filter</a></li>').appendTo(moduleOptionsUL);

            optFilterModule.find('a:first').click(function() {
                if ($(moduleOptions).find('.itemListFilterOptions').length == 0) {
                    var filterOptions = $('<div class="itemListFilterOptions"></div>');
                    moduleOptions.append(filterOptions);
                    filterOptions
                        .html('')
                        .setTemplateURL('/CMS/File/Resource?Assembly=OpenQuarters.WebQuarters.Modules.ItemList&Filename=Resources.Templates.FilterOptions.tpl')
                        .processTemplate(moduleElement.data('config'));

                    $('img.cmsDeleteFilter').each(function() {
                        $(this).css('cursor', 'pointer');
                        var removeFilterImage = this;
                        $(this).click(function() {
                            $(moduleElement).data(
                            'config',
                            $.extend(
                                $(moduleElement).data('config'), {
                                    Filters:
                                    $.grep(
                                        $(moduleElement).data('config').Filters,
                                        function(i) {
                                            return $(removeFilterImage).parent().attr('rel') != i.Id;
                                        }
                                    )
                                }
                            )
                        );
                            cmsSaveDraft();
                            cmsUpdateModule(moduleElement);
                        });
                    });
                }

                $('#itemListCloseFilters').click(function() {
                    filterOptions.remove();
                });

                $('#itemListAddButton').click(function() {
                    moduleElement.data('config').Filters.push({
                        Field: $('#itemListAddField').val(),
                        Operator: $('#itemListAddOperator').val(),
                        Value: $('#itemListAddValue').val()
                    });
                    cmsSaveDraft();
                    cmsUpdateModule(moduleElement);
                });
            });

            var optOrderingModule = $('<li><a href="javascript:void(0);">Ordering</a></li>').appendTo(moduleOptionsUL);

            optOrderingModule.find('a:first').click(function() {
                if ($(moduleOptions).find('.itemListFilterOptions').length == 0) {
                    var filterOptions = $('<div class="itemListOrderOptions"></div>');
                    moduleOptions.append(filterOptions);
                    filterOptions
                        .html('')
                        .setTemplateURL('/CMS/File/Resource?Assembly=OpenQuarters.WebQuarters.Modules.ItemList&Filename=Resources.Templates.OrderingOptions.tpl')
                        .processTemplate(moduleElement.data('config'));

                    $('img.cmsDeleteOrdering').each(function() {
                        $(this).css('cursor', 'pointer');
                        var removeOrderImage = this;
                        $(this).click(function() {
                            $(moduleElement).data(
                            'config',
                            $.extend(
                                $(moduleElement).data('config'), {
                                    Ordering:
                                    $.grep(
                                        $(moduleElement).data('config').Ordering,
                                        function(i) {
                                            return $(removeOrderImage).parent().attr('rel') != i.Id;
                                        }
                                    )
                                }
                            )
                        );
                            cmsSaveDraft();
                            cmsUpdateModule(moduleElement);
                        });
                    });
                }

                $('#itemListCloseOrdering').click(function() {
                    filterOptions.remove();
                });

                $('#itemListAddButton').click(function() {
                    moduleElement.data('config').Ordering.push({
                        Field: $('#itemListAddField').val(),
                        Operator: $('#itemListAddOperator').val()
                    });
                    cmsSaveDraft();
                    cmsUpdateModule(moduleElement);
                });
            });

            if (moduleElement.css('position') != 'absolute') {
                moduleElement.css('position', 'relative');
            }

            moduleElement.prepend(moduleOptions);
            moduleOptions.show(0).find('li').each(function() {
                $(this).css('cursor', 'pointer');
            });
        }
    });
};